package dubbot

import (
	"context"
	"github.com/creasty/defaults"
	"github.com/hyperway/pkg/logger"
)

type (
	// DubboContext Dubbo上下文
	DubboContext struct {
		context.Context                    // 上下文
		interfaceName   string             // 接口名
		method          string             // 方法名
		group           string             // 分组
		version         string             // 版本
		types           []string           // 参数类型
		values          interface{}        // 参数值
		attachments     interface{}        // 附加参数
		trace           logger.TraceLogger // 日志跟踪
		Protocol        string             `default:"6000"`     // 协议
		Timeout         string             `default:"6000"`     // 超时时间
		Retries         string             `default:"0"`        // 重试次数
		Cluster         string             `default:"failover"` // 集群
		LoadBalance     string             `default:"random"`   // 负载均衡
		Serialization   string             `default:"hessian2"` // 序列化
		Generic         bool               `default:"true"`     // 是否泛化
	}
)

// NewContext 创建Dubbo上下文
// context: 上下文
// interfaceName: 接口名
// method: 方法名
// group: 分组
// version: 版本
// Protocol: 协议
// types: 参数类型
// values: 参数值
// attachments: 附加参数
// trace: 日志跟踪
func NewContext(context context.Context, interfaceName, method, group, version, protocol string, types []string, values interface{}, attachments interface{}, trace logger.TraceLogger) (*DubboContext, error) {
	if attachments == nil {
		attachments = make(map[string]string)
	}
	dubboContext := &DubboContext{
		Context:       context,
		interfaceName: interfaceName,
		method:        method,
		group:         group,
		version:       version,
		types:         types,
		values:        values,
		attachments:   attachments,
		Protocol:      protocol,
		trace:         trace,
	}
	err := defaults.Set(dubboContext)
	if err != nil {
		return nil, err
	}
	return dubboContext, nil
}

// NewContextWithConfig 创建Dubbo上下文
// config: 配置
// context: 上下文
// values: 参数值
// attachments: 附加参数
// trace: 日志跟踪
func NewContextWithConfig(config *Config, context context.Context, values interface{}, attachments interface{}, trace logger.TraceLogger) (*DubboContext, error) {
	if attachments == nil {
		attachments = make(map[string]string)
	}
	dubboContext := &DubboContext{
		Context:       context,
		interfaceName: config.InterfaceName,
		method:        config.Method,
		group:         config.Group,
		version:       config.Version,
		types:         config.Types,
		values:        values,
		attachments:   attachments,
		Protocol:      config.Protocol,
		trace:         trace,
	}
	err := defaults.Set(dubboContext)
	if err != nil {
		return nil, err
	}
	return dubboContext, nil
}
